Désolé, je n'ai pas pu m'y mettre hier soir.
J’ai bien essayé de faire des triangles ( ça je peux )
mais ce que je n’arrive pas c’est de partir de l’abscisse (10) a une ordonnée de (0) (Pour faire les diagonales blanches)
J’ai bien essayé de modifier les formules sur une autre image mais ça me donne ça :

Pour le triangle noir ok il part de (0,0)
Mais je voudrais faire la même forme mais qui part de (0) sur l’abscisse mais moins haut sur l’ordonnée.
J’ai essayé de changer les valeurs ( triangle rouge) mais c’est pas bon....
C'est pas mal : tu arrives déjà à faire les triangles.
Le décalage n'est pas très compliqué : c'est juste un mix entre tes triangles noir et rouge !
# ton code pour le triangle noir
for x in range (0,250):
for y in range (x, 400 - x) :
im.putpixel((x,y), (0,0,0))
Ce code trace un succession de lignes verticales dont l'ordonnée des points sera comprise en x et 400 - x.
Quand tu es sur le bord, x = 0. Tu traces donc une ligne verticale qui va de 0 à 400 -0 = 400. Tu traces donc une ligne sur toute la verticale du drapeau.
Comme tu veux décaler un peu le tracé en haut et en bas - tu voulais un décalage de 40 px sur ton triangle rouge, il faut rajouter 40 en haut du drapeau, et retirer 40 en bas.
les lignes verticales devront être comprises entre x + 40 et 400 - x - 40.
Tu peux essayer pour voir ce que ça fait (j'ai pas essayé) : soit ça plante, soit ça va faire un deuxième petit triangle au bout du premier...
En fait j'ai essayé depuis, ça ne plante pas et ça ne fait pas de deuxième triangle.

. Python ne dessine pas les segments à l'envers... Bon, mais c'est pas propre de faire dessiner à Python des trucs qu'il ne dessine pas. On pense à la planète et à l'électricité inutile, et au CO2 qu'il a fallu produire... (de mon temps, on pensait surtout à accélérer le programme...)
Car en réduisant ainsi ton triangle, la pointe du triangle n'est plus à l'abscisse 200.
Comme elle est à toujours à l'ordonnée 200 (y = 200) c'est à dire au milieu de la hauteur, et comme y = x + 40 sur le bord du triangle, x = 160.
(on peut faire la même chose avec l'équation de l'autre bord y = 400 - x - 40... et on peut même regarder quand les deux bords se coupent, c'est à dire x + 40 = 400 - x - 40, on trouvera toujours x = 160

)
Il faut donc faire varier x entre 0 et 160.
# code modifié pour le triangle noir décalé des deux côtés
for x in range (0,160):
for y in range (x + 40, 400 - x - 40) :
im.putpixel((x,y), (0,0,0))
Maintenant... Le drapeau n'étant pas carré (600 x 400), il va falloir étirer le triangle vers la droite.
La pente de notre triangle est de 1 pour 1 ( y = x +...); alors qu'elle devrait être de 2 pour 3 ( y = 2/3 x + ...). Olivia peut vérifier quand x vaut 600 au bout du drapeau, y = 2/3 600 = 400
Il faut modifier le code en conséquence :
# code modifié pour le triangle noir décalé des deux côtés
# sur un drapeau 3:2
for x in range (0,160):
for y in range (2/3*x + 40, 400 - 2/3*x - 40) :
im.putpixel((x,y), (0,0,0))
En faisant cela, on rentre dans une autre dimension... puisque l'on multiplie un entier par un rationnel... et donc les entiers deviennent des nombres à virgules (float) quand l'interprêteur attend un entier. Il est gentil, il a dû t'adresser un gentil message d'erreur...
Alors on lui fait plaisir... on convertit les nombres à virgule en nombres entiers en utilisant la fonction int(). C'est pas compliqué, il faut juste le savoir....
for x in range (0,160):
for y in range (int(2/3*x + 40), int(400 - 2/3*x - 40)) :
im.putpixel((x,y), (0,0,0))
Il reste un petit problème que tu auras vite corrigé

Comme on descend moins vite sur le côté du triangle, il faut aller plus loin sur les abscisses.
La pointe est toujours à l'ordonnée 200 (au milieu de la hauteur du drapeau), sauf que y = 2/3 x + 40, soit 200 = 2/3 x + 40, soit x = 240 si j'ai encore tous mes neurones. Et don c au final :
for x in range (0,240):
for y in range (int(2/3*x + 40), int(400 - 2/3*x - 40)) :
im.putpixel((x,y), (0,0,0))

Pour le point bonus... Comment ça y en n'a pas ????
La fonction int() prend la partie entière du nombre à virgule : int (0.0001) = 0, et int (0,9999) = 0. C'est normal, mais cet arrondi donne un effet d'escalier au côté du triangle pas toujours très heureux.
Il existe une fonction round() qui fait l'arrondi. Il y a un bug (round 2.5) = 2 plutôt que 3 par convention. J'ai toujours fait int( x + 0.5) pour l'arrondi
for x in range (0,240):
for y in range (int(2/3*x + 40 + 0.5), int(400 - 2/3*x - 40 + 0.5)) :
im.putpixel((x,y), (0,0,0))
Voilà, voilou
Je te mets mon code pour l'Union Jack, avec une approche légèrement différente de la tienne, mais il n'y a pas de bonne ou moins bonne façon de tracer le drapeau.
# Exo 67
from PIL import Image
# un drapeau, c'est un rectangle 2:3
# Drapeau 'Union Jack'
im = Image.new("RGB", (600,400), "blue")
# bandes blanches drapeau écossais
for y in range(0,400):
for x in range (0,50):
x = int( y * 1.5 - 25 + x);
if x < 0: x = 0
if x > 599: x =599
im.putpixel((x, y), (255,255,255))
im.putpixel((599-x,y), (255,255,255))
# bandes rouges du drapeau gallois
for y in range(0,200):
for x in range (0,20):
im.putpixel((max(0,int(y * 1.5 - x)),y), (255,0,0))
im.putpixel((min(599,int(600 - y * 1.5 - x+.5)), y), (255,0,0))
im.putpixel((max(0,int(300 - y * 1.5 + x)), y+199), (255,0,0))
im.putpixel((min(599,int(300 + y * 1.5 + x+.5)), y+199), (255,0,0))
# bandes rouges drapeau anglais
for y in range(0,399):
for x in range (0,75):
im.putpixel((261+x,y), (255,255,255))
for y in range (0,75):
for x in range(0,599):
im.putpixel((x,161+y), (255,255,255))
for y in range(0,399):
for x in range (0,65):
im.putpixel((266+x,y), (255,0,0))
for y in range (0,65):
for x in range(0,599):
im.putpixel((x,166+y), (255,0,0))
# God save the queen
im.save("exo67c.png", "PNG")
Je commence à écrire des posts plus longs que les plus courts de Michel... faut que je sorte m'aérer.
